<?php
session_start();

/*
* File: CaptchaSecurityImages.php
* Author: Simon Jarvis
* Copyright: 2006 Simon Jarvis
* Date: 03/08/06
* Updated: 07/02/07
* Requirements: PHP 4/5 with GD and FreeType libraries
* Link: http://www.white-hat-web-design.co.uk/articles/php-captcha.php
* 
* This program is free software; you can redistribute it and/or 
* modify it under the terms of the GNU General Public License 
* as published by the Free Software Foundation; either version 2 
* of the License, or (at your option) any later version.
* 
* This program is distributed in the hope that it will be useful, 
* but WITHOUT ANY WARRANTY; without even the implied warranty of 
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 
* GNU General Public License for more details: 
* http://www.gnu.org/licenses/gpl.html
*
*/

class CaptchaSecurityImages {

	var $font = 'monofont.ttf';

	function generateCode($characters) {
		/* list all possible characters, similar looking characters and vowels have been removed */
		$possible = '23456789BCDFGHJKMNPQRSTVWXYZ';
		$code = '';
		$i = 0;
		while ($i < $characters) { 
			$code .= substr($possible, mt_rand(0, strlen($possible)-1), 1);
			$i++;
		}
		return $code;
	}

	/*function CaptchaSecurityImages($width='120',$height='40',$characters='6') {
        $p = pathinfo(__FILE__);
        $this->font = $p['dirname'].'/monofont.ttf';
		$code = $this->generateCode($characters);
		// font size will be 75% of the image height 
		$font_size = $height * 0.75;
		$image = @imagecreate($width, $height) or die('Cannot initialize new GD image stream');
		// set the colours 
		$background_color = imagecolorallocate($image, 255, 255, 255);
		$text_color = imagecolorallocate($image, 20, 40, 100);
		$noise_color = imagecolorallocate($image, 100, 120, 180);
		// generate random dots in background 
		for( $i=0; $i<($width*$height)/3; $i++ ) {
			imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $noise_color);
		}
		// generate random lines in background 
		for( $i=0; $i<($width*$height)/150; $i++ ) {
			imageline($image, mt_rand(0,$width), mt_rand(0,$height), mt_rand(0,$width), mt_rand(0,$height), $noise_color);
		}
		// create textbox and add text 
		$textbox = imagettfbbox($font_size, 0, $this->font, $code) or die('Error in imagettfbbox function');
		$x = ($width - $textbox[4])/2;
		$y = ($height - $textbox[5])/2;
		imagettftext($image, $font_size, 0, $x, $y, $text_color, $this->font , $code) or die('Error in imagettftext function');
		// output captcha image to browser
		header('Content-Type: image/jpeg');
		imagejpeg($image);
		imagedestroy($image);
		$_SESSION['security_code'] = $code;
	}*/
    
    function CaptchaSecurityImages($img_width='120',$img_height='40',$characters='6'){
        $img_width='120';
        $img_height='35';
        $characters='6';
        $p = pathinfo(__FILE__);
        $this->font = $p['dirname'].'/monofont.ttf';
        $font_path = $this->font;
		$code = $this->generateCode($characters);
        
        if (function_exists('imagecreatetruecolor'))
        {
            $im = imagecreatetruecolor($img_width, $img_height);
        }
        else
        {
            $im = imagecreate($img_width, $img_height);
        }
                
        // -----------------------------------
        //  Assign colors
        // -----------------------------------
        
        $bg_color		= imagecolorallocate ($im, 255, 255, 255);
        $border_color	= imagecolorallocate ($im, 153, 102, 102);
        $text_color		= imagecolorallocate ($im, 204, 153, 153);
        $grid_color		= imagecolorallocate($im, 255, 182, 182);
        $shadow_color	= imagecolorallocate($im, 255, 240, 240);

        // -----------------------------------
        //  Create the rectangle
        // -----------------------------------
        
        ImageFilledRectangle($im, 0, 0, $img_width, $img_height, $bg_color);
        
        // -----------------------------------
        //  Create the spiral pattern
        // -----------------------------------
        
        $theta		= 1;
        $thetac		= 7;
        $radius		= 16;
        $circles	= 20;
        $points		= 32;

        /*for ($i = 0; $i < ($circles * $points) - 1; $i++)
        {
            $theta = $theta + $thetac;
            $rad = $radius * ($i / $points );
            $x = ($rad * cos($theta)) + $x_axis;
            $y = ($rad * sin($theta)) + $y_axis;
            $theta = $theta + $thetac;
            $rad1 = $radius * (($i + 1) / $points);
            $x1 = ($rad1 * cos($theta)) + $x_axis;
            $y1 = ($rad1 * sin($theta )) + $y_axis;
            imageline($im, $x, $y, $x1, $y1, $grid_color);
            $theta = $theta - $thetac;
        }*/

        // -----------------------------------
        //  Write the text
        // -----------------------------------
        
        $use_font = ($font_path != '' AND file_exists($font_path) AND function_exists('imagettftext')) ? TRUE : FALSE;
            
        if ($use_font == FALSE)
        {
            $font_size = 5;
            $x = rand(0, $img_width/($characters/3));
            $y = 0;
        }
        else
        {
            $font_size	= 16;
            $x = rand(0, $img_width/($characters/1.5));
            $y = $font_size+2;
        }

        for ($i = 0; $i < strlen($code); $i++)
        {
            if ($use_font == FALSE)
            {
                $y = rand(0 , $img_height/2);
                imagestring($im, $font_size, $x, $y, substr($code, $i, 1), $text_color);
                $x += ($font_size*2);
            }
            else
            {		
                $y = rand($img_height/2, $img_height-3);
                imagettftext($im, $font_size, $angle, $x, $y, $text_color, $font_path, substr($code, $i, 1));
                $x += $font_size;
            }
        }
        

        // -----------------------------------
        //  Create the border
        // -----------------------------------

        imagerectangle($im, 0, 0, $img_width-1, $img_height-1, $border_color);		

        header('Content-Type: image/jpeg');
		imagejpeg($im);
		imagedestroy($im);
		$_SESSION['security_code'] = $code;

    }
}

$width = isset($_GET['width']) ? $_GET['width'] : '120';
$height = isset($_GET['height']) ? $_GET['height'] : '40';
$characters = isset($_GET['characters']) && $_GET['characters'] > 1 ? $_GET['characters'] : '6';

$captcha = new CaptchaSecurityImages($width,$height,$characters);

?>